package com.pancm.datacollector.queue;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 数据队列管理器
 * 负责管理采集数据的队列
 */
@Component
public class DataQueueManager {
    private static final Logger LOG = LoggerFactory.getLogger(DataQueueManager.class);
    
    /**
     * 数据队列
     */
    private final BlockingQueue<CollectedData> dataQueue;
    
    /**
     * 队列容量
     */
    @Value("${collector.queue.capacity:1000}")
    private int queueCapacity;
    
    /**
     * 入队超时时间（毫秒）
     */
    @Value("${collector.queue.offer.timeout:1000}")
    private long offerTimeout;

    public DataQueueManager() {
        this.dataQueue = new LinkedBlockingQueue<>();
    }
    
    @PostConstruct
    public void init() {
        LOG.info("初始化数据队列管理器，队列容量: {}", queueCapacity);
    }

    /**
     * 将数据放入队列
     * @param data 待处理的数据
     * @return 是否成功放入队列
     */
    public boolean offer(CollectedData data) {
        try {
            boolean success = dataQueue.offer(data, offerTimeout, TimeUnit.MILLISECONDS);
            if (success) {
                LOG.debug("数据成功放入队列, ID: {}", data.getId());
            } else {
                LOG.warn("数据放入队列超时, ID: {}", data.getId());
            }
            return success;
        } catch (InterruptedException e) {
            LOG.error("数据入队被中断, ID: {}", data.getId(), e);
            Thread.currentThread().interrupt();
            return false;
        }
    }

    /**
     * 从队列中取出数据
     * @return 待处理的数据，如果队列为空则返回null
     */
    public CollectedData poll() {
        try {
            CollectedData data = dataQueue.poll(offerTimeout, TimeUnit.MILLISECONDS);
            if (data != null) {
                LOG.debug("成功从队列取出数据, ID: {}", data.getId());
            }
            return data;
        } catch (InterruptedException e) {
            LOG.error("从队列取数据被中断", e);
            Thread.currentThread().interrupt();
            return null;
        }
    }

    /**
     * 获取当前队列大小
     * @return 队列中的数据量
     */
    public int getQueueSize() {
        return dataQueue.size();
    }

    /**
     * 清空队列
     */
    public void clear() {
        dataQueue.clear();
        LOG.info("队列已清空");
    }
} 